React์ ์คํ์ 'scope' ๊ตฌํ์ ํ์ํ์ฌ ์ปดํฌ๋ํธ ์ค์ฝํ ๊ด๋ฆฌ๋ฅผ ๋ง์คํฐํ๊ณ , ๊ทธ ์ด์ ์ ์ดํดํ๋ฉฐ, ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฑ๋ฅ, ์ ์ง๋ณด์์ฑ, ํ์ฅ์ฑ์ ์ต์ ํํ๋ ๋ฐฉ๋ฒ์ ์์๋ณด์ธ์.
React์ ์คํ์ Scope ๊ตฌํ ๋ง์คํฐํ๊ธฐ: ์ปดํฌ๋ํธ ์ค์ฝํ ๊ด๋ฆฌ
๋์์์ด ๋ฐ์ ํ๋ ํ๋ก ํธ์๋ ๊ฐ๋ฐ ํ๊ฒฝ์์ React๋ ๊ฐ๋ฐ์ ๊ฒฝํ๊ณผ ์ ํ๋ฆฌ์ผ์ด์ ์ฑ๋ฅ์ ํฅ์์ํค๊ธฐ ์ํด ์คํ์ ์ธ ๊ธฐ๋ฅ๋ค์ ๊ณ์ํด์ ๋์ ํ๊ณ ์์ต๋๋ค. ๊ทธ์ค ํ๋์ธ ์คํ์ 'scope' ๊ตฌํ์ React ์ ํ๋ฆฌ์ผ์ด์ ๋ด์์ ์ปดํฌ๋ํธ ์ค์ฝํ์ ์ํ๋ฅผ ๊ด๋ฆฌํ๋ ๊ฐ๋ ฅํ ์ ๊ทผ ๋ฐฉ์์ ์ ๊ณตํฉ๋๋ค. ์ด ๊ธ์์๋ ๋ ์ ์ง๋ณด์ํ๊ธฐ ์ฝ๊ณ , ์ฑ๋ฅ์ด ๋ฐ์ด๋๋ฉฐ, ํ์ฅ ๊ฐ๋ฅํ React ํ๋ก์ ํธ๋ฅผ ์ํด ์ด ๊ธฐ๋ฅ์ ์ดํดํ๊ณ ํ์ฉํ๋ ํฌ๊ด์ ์ธ ๊ฐ์ด๋๋ฅผ ์ ๊ณตํฉ๋๋ค. ํต์ฌ ๊ฐ๋ , ์ค์ ์์ , ๊ทธ๋ฆฌ๊ณ ์ด ํฅ๋ฏธ๋ก์ด ์ ๊ธฐ๋ฅ์ ์ฑํํ๊ธฐ ์ํ ๊ณ ๋ ค ์ฌํญ์ ๋ํด ์์ธํ ์์๋ณด๊ฒ ์ต๋๋ค.
ํต์ฌ ๊ฐ๋ ์ดํดํ๊ธฐ: ์ปดํฌ๋ํธ ์ค์ฝํ๋ ๋ฌด์์ธ๊ฐ?
React์์ ์ปดํฌ๋ํธ ์ค์ฝํ์ ํต์ฌ์ ์ปดํฌ๋ํธ์ ์ํ, ๋ณ์, ์๋ช
์ฃผ๊ธฐ ๋ฉ์๋๊ฐ ์๋ํ๋ ๊ฒฝ๊ณ๋ฅผ ์๋ฏธํฉ๋๋ค. ์ ํต์ ์ผ๋ก React ์ปดํฌ๋ํธ๋ ํจ์ํ ์ปดํฌ๋ํธ์ ํ
(์: useState, useEffect)์ด๋ ํด๋์ค ์ปดํฌ๋ํธ์ state ๋ฐ ๋ฉ์๋์ ๊ฐ์ ๋ฉ์ปค๋์ฆ์ ์์กดํ์ฌ ๋ด๋ถ ๋ฐ์ดํฐ์ ๋์์ ๊ด๋ฆฌํด์์ต๋๋ค. ๊ทธ๋ฌ๋ ๋ณต์กํ ์ปดํฌ๋ํธ ๋ก์ง์ ๊ด๋ฆฌํ๋ ๊ฒ์ ํนํ ์ ํ๋ฆฌ์ผ์ด์
์ ๊ท๋ชจ์ ๋ณต์ก์ฑ์ด ์ปค์ง์ ๋ฐ๋ผ ๊ตฌ์ฑ, ๊ฐ๋
์ฑ, ์ฑ๋ฅ ๋ฉด์์ ์ด๋ ค์์ ์ด๋ํ ์ ์์ต๋๋ค.
์คํ์ ์ธ 'scope' ๊ตฌํ์ ์ปดํฌ๋ํธ ์ค์ฝํ๋ฅผ ๋ ๊ตฌ์กฐํ๋๊ณ ์ฒด๊ณ์ ์ผ๋ก ๊ด๋ฆฌํ๋ ๋ฐฉ๋ฒ์ ์ ๊ณตํจ์ผ๋ก์จ ์ด๋ฌํ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ๊ฒ์ ๋ชฉํ๋ก ํฉ๋๋ค. ์ด๋ ๊ด๋ จ๋ ๋ก์ง์ ๊ทธ๋ฃนํํ๊ณ ์บก์ํํ๋ ์๋ก์ด ๋ฐฉ๋ฒ์ ๋์ ํ์ฌ ๊ฐ๋ณ ์ปดํฌ๋ํธ์ ๋์์ ๋ ์ฝ๊ฒ ์ดํดํ๊ณ , ์ ์ง๋ณด์ํ๋ฉฐ, ์ถ๋ก ํ ์ ์๊ฒ ๋ง๋ญ๋๋ค. ์ด๋ ๋ ๊น๋ํ ์ฝ๋๋ก ์ด์ด์ง๋ฉฐ, React์ ์ฌ์กฐ์ ์(reconciler)๋ฅผ ์ํ ๋ ๋์ ์ต์ ํ ๊ธฐํ ๋๋ถ์ ์ ์ฌ์ ์ผ๋ก ์ฑ๋ฅ ํฅ์์ ๊ฐ์ ธ์ฌ ์ ์์ต๋๋ค.
์ปดํฌ๋ํธ ์ค์ฝํ ๊ด๋ฆฌ์ ์ด์
์ ์ ์๋ ์ปดํฌ๋ํธ ์ค์ฝํ ๊ด๋ฆฌ ์ ๋ต์ ์ฑํํ๋ฉด ๋ค์๊ณผ ๊ฐ์ ์ฌ๋ฌ ๊ฐ์ง ์ค์ํ ์ด์ ์ ์ป์ ์ ์์ต๋๋ค:
- ํฅ์๋ ์ฝ๋ ๊ตฌ์ฑ ๋ฐ ๊ฐ๋ ์ฑ: ๊ด๋ จ๋ ๋ก์ง์ ํน์ ์ค์ฝํ ๋ด์ ์บก์ํํจ์ผ๋ก์จ ๊ฐ๋ฐ์๋ ๋ ๋ชจ๋ํ๋๊ณ ์ฒด๊ณ์ ์ธ ์ฝ๋๋ฒ ์ด์ค๋ฅผ ๋ง๋ค ์ ์์ต๋๋ค. ์ด๋ ๊ฐ ์ปดํฌ๋ํธ์ ๋ชฉ์ ๊ณผ ๊ธฐ๋ฅ์ ๋ ์ฝ๊ฒ ์ดํดํ๊ฒ ํ์ฌ ๊ฐ๋ ์ฑ์ ๋์ด๊ณ ์ธ์ง ๋ถํ๋ฅผ ์ค์ฌ์ค๋๋ค.
- ํฅ์๋ ์ ์ง๋ณด์์ฑ: ์ฝ๋๊ฐ ์ ์ ๋ฆฌ๋์ด ์์ผ๋ฉด ์์ ํ๊ณ ์ ์ง๋ณด์ํ๊ธฐ๊ฐ ๋ ์ฌ์์ง๋๋ค. 'scope' ๊ตฌํ์ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ค๋ฅธ ๋ถ๋ถ์ ์ํฅ์ ์ฃผ์ง ์๊ณ ๊ฐ๋ณ ์ปดํฌ๋ํธ๋ฅผ ๋ณ๊ฒฝํ๋ ๊ฒ์ ์ฉ์ดํ๊ฒ ํ์ฌ ์๋์น ์์ ๋ถ์์ฉ์ ์ผ์ผํฌ ์ํ์ ์ค์ ๋๋ค.
- ๋ ๋์ ์ฑ๋ฅ ์ต์ ํ: React๋ 'scope' ์ ๋ณด๋ฅผ ํ์ฉํ์ฌ ๋ ๋๋ง ํ๋ก์ธ์ค๋ฅผ ์ต์ ํํ ์ ์์ต๋๋ค. ์ปดํฌ๋ํธ ์ค์ฝํ์ ๊ฒฝ๊ณ๋ฅผ ํ์ ํจ์ผ๋ก์จ React๋ ์ํ ๋ณ๊ฒฝ์ด ๋ฐ์ํ์ ๋ ์ปดํฌ๋ํธ์ ์ด๋ ๋ถ๋ถ์ ๋ค์ ๋ ๋๋งํด์ผ ํ๋์ง ๋ ํจ์จ์ ์ผ๋ก ๊ฒฐ์ ํ ์ ์์ต๋๋ค.
- ์ํ ๊ด๋ฆฌ ๋ณต์ก์ฑ ๊ฐ์: Redux๋ Zustand์ ๊ฐ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ์ ์ฉํ์ง๋ง, ์คํ์ ์ธ ์ค์ฝํ ๊ตฌํ์ ๋ ๊ฐ๋จํ ์๋๋ฆฌ์ค์์ ์ธ๋ถ ์ํ ๊ด๋ฆฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋ํ ์์กด๋๋ฅผ ์ค์ด๋ ๋ฐ ๋์์ด ๋ ์ ์์ต๋๋ค. ์ด๋ ์ปดํฌ๋ํธ ๋ด์์ ์ํ๋ฅผ ๊ด๋ฆฌํ๋ ๋ ์ง์ญํ๋ ์ ๊ทผ ๋ฐฉ์์ ์ ๊ณตํฉ๋๋ค.
- ๊ฐ์ํ๋ ํ ์คํธ: ์ค์ฝํ๊ฐ ์ ์ฉ๋ ์ปดํฌ๋ํธ๋ ๋์์ด ๋ ์บก์ํ๋์ด ์๊ธฐ ๋๋ฌธ์ ํ ์คํธํ๊ธฐ๊ฐ ๋ ์ฌ์ด ๊ฒฝ์ฐ๊ฐ ๋ง์ต๋๋ค. ์ด๋ ์ปดํฌ๋ํธ ๊ธฐ๋ฅ์ ํน์ ์ธก๋ฉด์ ์ด์ ์ ๋ง์ถ ๋จ์ ํ ์คํธ๋ฅผ ์์ฑํ๋ ๊ฒ์ ๋ ์ฝ๊ฒ ๋ง๋ญ๋๋ค.
์คํ์ 'scope' ๊ตฌํ ํ์: ์ค์ ์์
์ ํํ ๊ตฌํ ์ธ๋ถ ์ฌํญ์ ๊ธฐ๋ฅ์ด ๋ฐ์ ํจ์ ๋ฐ๋ผ ๋ฌ๋ผ์ง ์ ์์ง๋ง, 'scope' ๊ตฌํ์ด React์์ ์ด๋ป๊ฒ ์๋ํ ์ ์๋์ง์ ๋ํ ๊ฐ๋ ์ ์ธ ์์๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค (์ฐธ๊ณ : ์ด๊ฒ์ ํ์ฌ์ ์ดํด๋ฅผ ๋ฐํ์ผ๋ก ํ ๊ฐ๋ ์ ์ธ ์์์ด๋ฉฐ ํ์ ๋ API๊ฐ ์๋๋๋ค. ์ต์ ์ ์ ํํ ์ ๋ณด๋ ๊ณต์ React ๋ฌธ์๋ฅผ ์ฐธ์กฐํ์ญ์์ค):
๊ฐ๋จํ ์นด์ดํฐ ์ปดํฌ๋ํธ๋ฅผ ์์ํด ๋ด ์๋ค. ์ค์ฝํ ๊ตฌํ์ด ์๋ค๋ฉด ๋ค์๊ณผ ๊ฐ์ด ์์ฑํ ์ ์์ต๋๋ค:
import React, { useState } from 'react';
function Counter() {
const [count, setCount] = useState(0);
const increment = () => {
setCount(count + 1);
};
const decrement = () => {
setCount(count - 1);
};
return (
<div>
<p>Count: {count}</p>
<button onClick={increment}>Increment</button>
<button onClick={decrement}>Decrement</button>
</div>
);
}
export default Counter;
์คํ์ ์ธ ์ค์ฝํ ๊ตฌํ์ ์ฌ์ฉํ๋ฉด, ์ด๋ ์ ์ฌ์ ์ผ๋ก ๋ ๊ตฌ์กฐํ๋ ์ ๊ทผ ๋ฐฉ์์ผ๋ก ๊ตฌ์ฑ๋ ์ ์์ต๋๋ค (๋ค์ ๋งํ์ง๋ง, ๊ฐ๋ ์ ์ ๋๋ค):
import React from 'react';
const useCounterScope = () => {
const [count, setCount] = React.useState(0);
const increment = () => {
setCount(count + 1);
};
const decrement = () => {
setCount(count - 1);
};
return {
count,
increment,
decrement,
};
};
function Counter() {
const { count, increment, decrement } = useCounterScope();
return (
<div>
<p>Count: {count}</p>
<button onClick={increment}>Increment</button>
<button onClick={decrement}>Decrement</button>
</div>
);
}
export default Counter;
์ด ๊ฐ๋
์ ์ธ ์์ ์์ useCounterScope ํจ์๋ ์ ์๋ ์ค์ฝํ ์ญํ ์ ํ์ฌ ์ํ(count)์ ๊ด๋ จ ํจ์(increment, decrement)๋ฅผ ์บก์ํํฉ๋๋ค. ์ด ๊ตฌ์กฐ๋ ์ฝ๋ ๊ตฌ์ฑ๊ณผ ์ฌ์ฌ์ฉ์ฑ์ ์ด์งํฉ๋๋ค.
๋ ๋ณต์กํ ์์ ๋ฅผ ๊ณ ๋ คํด ๋ด ์๋ค: API์์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ ํ์ํ๋ ์ปดํฌ๋ํธ์ ๋๋ค. ์ด ์์ ๋ ์ค์ฝํ๊ฐ ๋ฐ์ดํฐ ๊ฐ์ ธ์ค๊ธฐ ๋ก์ง๊ณผ ๊ด๋ จ ์ํ ๊ด๋ฆฌ๋ฅผ ์บก์ํํ๋ ๋ฐ ์ด๋ป๊ฒ ๋์์ด ๋๋์ง ๋ณด์ฌ์ค๋๋ค.
import React, { useState, useEffect } from 'react';
const useDataFetchScope = (url) => {
const [data, setData] = useState(null);
const [loading, setLoading] = useState(true);
const [error, setError] = useState(null);
useEffect(() => {
const fetchData = async () => {
try {
const response = await fetch(url);
if (!response.ok) {
throw new Error(`HTTP error! status: ${response.status}`);
}
const json = await response.json();
setData(json);
} catch (e) {
setError(e);
} finally {
setLoading(false);
}
};
fetchData();
}, [url]);
return {
data,
loading,
error,
};
};
function DataDisplay({ url }) {
const { data, loading, error } = useDataFetchScope(url);
if (loading) return <p>Loading...</p>;
if (error) return <p>Error: {error.message}</p>;
if (!data) return null;
return (
<ul>
{data.map((item) => (
<li key={item.id}>{item.name}</li>
))}
</ul>
);
}
export default DataDisplay;
์ด ์์ ์์ useDataFetchScope๋ ๋ฐ์ดํฐ ๊ฐ์ ธ์ค๊ธฐ ๋ก์ง, ๋ก๋ฉ, ๋ฐ์ดํฐ ๋ฐ ์ค๋ฅ ์ฒ๋ฆฌ์ ๋ํ ์ํ๋ฅผ ์บก์ํํฉ๋๋ค. ์ด๋ ๋ฐ์ดํฐ ๊ฐ์ ธ์ค๊ธฐ์ ๊ด๋ จ๋ ๋ถ๋ถ์ ์ปดํฌ๋ํธ์ ๋ ๋๋ง ๋ก์ง์์ ๋ถ๋ฆฌํ์ฌ ๊ฐ๋
์ฑ๊ณผ ์ ์ง๋ณด์์ฑ์ ํฅ์์ํต๋๋ค. DataDisplay ์ปดํฌ๋ํธ๋ ๋จ์ํ ์ค์ฝํ์ ๊ฒฐ๊ณผ๋ฅผ ์ฌ์ฉํ๊ธฐ๋ง ํฉ๋๋ค.
๊ณ ๊ธ ์ค์ฝํ ๊ด๋ฆฌ ๊ธฐ๋ฒ
๊ธฐ๋ณธ์ ์ธ ์บก์ํ ์ธ์๋ ์ค์ฝํ ๊ด๋ฆฌ๋ฅผ ๊ฐ์ ํ๊ธฐ ์ํด ์ฌ์ฉํ ์ ์๋ ๊ณ ๊ธ ๊ธฐ๋ฒ๋ค์ด ์์ต๋๋ค:
- ์ปค์คํ ํ : ๊ณตํต ๋ก์ง์ ์ปค์คํ ํ ์ผ๋ก ์ถ์ถํ์ฌ ์ฌ์ฌ์ฉ ๊ฐ๋ฅํ ์ค์ฝํ๋ฅผ ๋ง๋ญ๋๋ค. ์ด๋ ์ฝ๋ ์ฌ์ฌ์ฉ์ ์ด์งํ๊ณ ์ค๋ณต์ ์ค์ ๋๋ค. ์๋ฅผ ๋ค์ด, ๋ฐ์ดํฐ ๊ฐ์ ธ์ค๊ธฐ๋ ํผ ์ ํจ์ฑ ๊ฒ์ฌ๋ฅผ ์ํ ์ปค์คํ ํ ์ ๋ง๋ค์ด ์ฌ๋ฌ ์ปดํฌ๋ํธ์์ ์ฌ์ฌ์ฉํ ์ ์์ต๋๋ค.
- Context ํตํฉ: ์ค์ฝํ ๋ด์์ React Context๋ฅผ ํ์ฉํ์ฌ ์ปดํฌ๋ํธ ํ์ ํธ๋ฆฌ ์ ์ฒด์ ๋ฐ์ดํฐ์ ํจ์๋ฅผ ๊ณต์ ํฉ๋๋ค. ์ด๋ ํนํ ์ ์ญ ์ํ๋ ํ ๋ง ์ค์ ๊ณผ ๊ฐ์ด ์ฌ๋ฌ ๋ ๋ฒจ์ ์ปดํฌ๋ํธ ํธ๋ฆฌ๋ฅผ ๊ฑฐ์ณ props๋ฅผ ์ ๋ฌํ๋ ๊ฒ์ ๋จ์ํํ ์ ์์ต๋๋ค.
- ๋ฉ๋ชจ์ด์ ์ด์
: ์ค์ฝํ ๋ด์์
React.useMemo์React.useCallback์ ์ฌ์ฉํ์ฌ ๋น์ฉ์ด ๋ง์ด ๋๋ ๊ณ์ฐ์ด๋ ๋งค ๋ ๋๋ง๋ง๋ค ๋ค์ ๊ณ์ฐํ ํ์๊ฐ ์๋ ํจ์๋ฅผ ๋ฉ๋ชจ์ด์งํ์ฌ ์ฑ๋ฅ์ ์ต์ ํํฉ๋๋ค. - ์์กด์ฑ ๊ด๋ฆฌ:
useEffectํ ๊ณผ ์ค์ฝํ ํจ์ ๋ด์ ์์กด์ฑ์ ์ ์คํ๊ฒ ๊ด๋ฆฌํ์ฌ ๋ถํ์ํ ์ฌ๋ ๋๋ง์ ๋ฐฉ์งํ๊ณ ์ฌ๋ฐ๋ฅธ ๋์์ ๋ณด์ฅํฉ๋๋ค.useEffect์ ์์กด์ฑ ๋ฐฐ์ด์ ํ์ฉํ์ฌ ์ดํํธ๊ฐ ๋ค์ ์คํ๋์ด์ผ ํ ์์ ์ ์ง์ ํฉ๋๋ค. - ํฉ์ฑ(Composition): ์ฌ๋ฌ ์ค์ฝํ๋ฅผ ๊ฒฐํฉํ์ฌ ๋ณต์กํ๊ณ ์ ์ฐํ ์ปดํฌ๋ํธ ๋ก์ง์ ๋ง๋ญ๋๋ค. ์ด๋ฅผ ํตํด ๋ค์ํ ๊ธฐ๋ฅ์ ํฉ์ฑํ๊ณ ๊ฐ๋ ฅํ๋ฉฐ ์ฌ์ฌ์ฉ ๊ฐ๋ฅํ ์ปดํฌ๋ํธ๋ฅผ ๋ง๋ค ์ ์์ต๋๋ค.
์คํ์ ์ค์ฝํ ๊ตฌํ์ ์ํ ๋ชจ๋ฒ ์ฌ๋ก
์คํ์ 'scope' ๊ตฌํ์ ์ต๋ํ ํ์ฉํ๋ ค๋ฉด ๋ค์๊ณผ ๊ฐ์ ๋ชจ๋ฒ ์ฌ๋ก๋ฅผ ๊ณ ๋ คํ์ญ์์ค:
- ์๊ฒ ์์ํ๊ธฐ: ํ ๋ฒ์ ์ ์ฒด ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ฆฌํฉํ ๋งํ๋ ค๊ณ ํ์ง ๋ง์ญ์์ค. ๊ฐ๋ณ ์ปดํฌ๋ํธ๋ ์ฝ๋์ ์ผ๋ถ์ ์ค์ฝํ ๊ด๋ฆฌ๋ฅผ ์ ์ฉํ์ฌ ์ ์ง์ ์ผ๋ก ์ ๊ทผ ๋ฐฉ์์ ๋์ ํ๊ณ ๊ฒ์ฆํ์ญ์์ค.
- ์ค์ฝํ ๋ฌธ์ํ: ๊ฐ ์ค์ฝํ์ ๋ชฉ์ ๊ณผ ๊ธฐ๋ฅ, ์ ๋ ฅ, ์ถ๋ ฅ ๋ฐ ๋ชจ๋ ์์กด์ฑ์ ๋ช ํํ๊ฒ ๋ฌธ์ํํ์ญ์์ค. ์ด๋ ๊ฐ๋ ์ฑ๊ณผ ์ ์ง๋ณด์์ฑ์ ํฅ์์ํฌ ๊ฒ์ ๋๋ค.
- ์ค๋ช ์ ์ธ ์ด๋ฆ ์ฌ์ฉ: ์ปค์คํ ํ ๊ณผ ์ค์ฝํ ํจ์์ ๋ชฉ์ ์ ๋ช ํํ๊ฒ ์ ๋ฌํ๊ธฐ ์ํด ์๋ฏธ ์๋ ์ด๋ฆ์ ์ ํํ์ญ์์ค. ๊ฐ ์ค์ฝํ์ ํฌํจ๋ ๋ก์ง์ ์ ํํ๊ฒ ๋ฐ์ํ๋ ์ด๋ฆ์ ์ฌ์ฉํ์ญ์์ค.
- ์ฒ ์ ํ ํ ์คํธ: ์ค์ฝํ๊ฐ ์ ์ฉ๋ ์ปดํฌ๋ํธ์ ๋ํ ๋จ์ ํ ์คํธ๋ฅผ ์์ฑํ์ฌ ๋์์ด ์ฌ๋ฐ๋ฅธ์ง, ์์๋๋ก ์๋ํ๋์ง ํ์ธํ์ญ์์ค. ์ค์ฝํ๊ฐ ๋ค์ํ ์๋๋ฆฌ์ค์ ์ฃ์ง ์ผ์ด์ค๋ฅผ ์ด๋ป๊ฒ ์ฒ๋ฆฌํ๋์ง ์ฃผ์ ๊น๊ฒ ์ดํด๋ณด์ญ์์ค.
- ์ต์ ์ ๋ณด ์ ์ง: React ๋ฌธ์ ๋ฐ ์ปค๋ฎค๋ํฐ ํ ๋ก ์ ์ฃผ์ํ์ฌ ์คํ์ 'scope' ๊ตฌํ๊ณผ ๊ด๋ จ๋ ์ต์ ์ ๋ฐ์ดํธ ๋ฐ ๋ชจ๋ฒ ์ฌ๋ก์ ๋ํ ์ ๋ณด๋ฅผ ์ป์ผ์ญ์์ค. React์ API๋ ์งํํ๋ฏ๋ก ๊ตฌํํ๊ธฐ ์ ์ ํญ์ ์ต์ ๋ฌธ์๋ฅผ ํ์ธํด์ผ ํฉ๋๋ค.
- ์ฑ๋ฅ ํ๋กํ์ผ๋ง: React Profiler๋ฅผ ์ฌ์ฉํ์ฌ ์ค์ฝํ๊ฐ ์ ์ฉ๋ ์ปดํฌ๋ํธ์ ์ฑ๋ฅ ๋ณ๋ชฉ ํ์์ ์๋ณํ์ญ์์ค. ์ด๋ ์ฝ๋๋ฅผ ์ต์ ํํ๊ณ ํจ์จ์ ์ผ๋ก ์คํ๋๋๋ก ํ๋ ๋ฐ ๋์์ด ๋ ๊ฒ์ ๋๋ค.
- ์ฌ์ฉ ์ฌ๋ก ์ ์คํ๊ฒ ๊ณ ๋ คํ๊ธฐ: ๋ชจ๋ ์ปดํฌ๋ํธ์ ๋ณ๋์ ์ค์ฝํ๊ฐ ํ์ํ ๊ฒ์ ์๋๋๋ค. ์ค์ฝํ์ ์ด์ ์ด ๋ณต์ก์ฑ์ ์์ํ๋์ง ํ๊ฐํ์ญ์์ค. ๋ณต์กํ ๋ก์ง์ด๋ ๊ณต์ ์ํ๊ฐ ์๋ ์ปดํฌ๋ํธ์ ์ค์ฝํ์ ์ฐ์ ์ ์ผ๋ก ์ ์ฉํ์ญ์์ค.
- ์ผ๊ด์ฑ ์ ์ง: ์ ํ๋ฆฌ์ผ์ด์
์ ์ฒด์์ ์ค์ฝํ๋ฅผ ์ ์ํ๊ณ ์ฌ์ฉํ๋ ์ผ๊ด๋ ํจํด์ ์ค์ ํ์ญ์์ค. ์ด๋ ๊ฒ ํ๋ฉด ์ฝ๋๋ฅผ ๋ ์ฝ๊ฒ ์ดํดํ๊ณ ์ ์ง๋ณด์ํ ์ ์์ต๋๋ค. ์ฌ๊ธฐ์๋ ๋ช
๋ช
๊ท์น(์: use
Scope)์ด ํฌํจ๋ ์ ์์ต๋๋ค.
์ ์ฌ์ ๋ฌธ์ ํด๊ฒฐํ๊ธฐ
์คํ์ 'scope' ๊ตฌํ์ ์๋นํ ์ด์ ์ ์ ๊ณตํ์ง๋ง, ์์๋์ด์ผ ํ ๋ช ๊ฐ์ง ์ ์ฌ์ ์ธ ๋ฌธ์ ๊ฐ ์์ต๋๋ค:
- ํ์ต ๊ณก์ : ๊ฐ๋ฐ์๋ ์ปดํฌ๋ํธ ๋ก์ง์ ๊ตฌ์ฑํ๋ ์๋ก์ด ๋ฐฉ์์ ์ ์ํด์ผ ํ๋ฉฐ, ์ด๋ ์ด๊ธฐ ์๊ฐ๊ณผ ๋ ธ๋ ฅ์ด ํ์ํ ์ ์์ต๋๋ค.
- ํธํ์ฑ: ์ด ๊ธฐ๋ฅ์ ์คํ์ ์ธ ํน์ฑ์ ํฅํ React ๋ฒ์ ์์ API๋ ๋์์ด ๋ณ๊ฒฝ๋ ์ ์์์ ์๋ฏธํฉ๋๋ค. ๊ฐ์ฅ ์ต์ ์ ๋ณด๋ ํญ์ ๊ณต์ ๋ฌธ์๋ฅผ ์ฐธ์กฐํ์ญ์์ค.
- ๊ณผ๋ํ ์ค์ฝํ: ์ฝ๋๋ฅผ ๊ณผ๋ํ๊ฒ ์ค์ฝํํ์ฌ ๋ถํ์ํ ๋ณต์ก์ฑ์ ์ด๋ํ ์ ์์ต๋๋ค. ๊ฐ ์ปดํฌ๋ํธ์ ์๊ตฌ ์ฌํญ์ ์ ์คํ๊ฒ ๊ณ ๋ คํ๊ณ ๊ฐ์น๋ฅผ ๋ํ ๋๋ง ์ค์ฝํ๋ฅผ ์ฌ์ฉํ์ญ์์ค.
- ๋๊ตฌ ๋ฐ ์ํ๊ณ: React ์ํ๊ณ๋ ๊ฐ๋ ฅํ์ง๋ง, ์ค์ฝํ ๊ด๋ฆฌ๋ฅผ ์ง์ ์ ์ผ๋ก ๋ค๋ฃจ๋ ๊ธฐ์กด ๋๊ตฌ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ๋ถ์กฑํ ์ ์์ต๋๋ค.
๊ธ๋ก๋ฒ ์ ์ฉ ๋ฐ ๊ณ ๋ ค ์ฌํญ
React๋ ์น ์ ํ๋ฆฌ์ผ์ด์ ๊ตฌ์ถ์ ์ํด ์ ์ธ๊ณ์ ์ผ๋ก ์ฌ์ฉ๋๋ฉฐ, ํจ๊ณผ์ ์ธ ์ปดํฌ๋ํธ ์ค์ฝํ ๊ด๋ฆฌ๋ ๋ณดํธ์ ์ผ๋ก ์ ์ตํฉ๋๋ค. ๋ค์๊ณผ ๊ฐ์ ๊ธ๋ก๋ฒ ์ธก๋ฉด์ ๊ณ ๋ คํ์ญ์์ค:
- ์ง์ญํ: ์ค์ฝํ ๊ตฌํ์ ์ฃผ๋ก ์ฝ๋ ๊ตฌ์กฐ์ ์ค์ ์ ๋์ง๋ง, ์ง์ญํ๋ ์ ๋ฐ์ ์ธ ๊ฐ๋ฐ ์ ๋ต์ ์ผ๋ถ๊ฐ ๋์ด์ผ ํฉ๋๋ค. ์ปดํฌ๋ํธ๊ฐ ๋ค์ํ ์ธ์ด, ๋ ์ง ํ์ ๋ฐ ํตํ๋ฅผ ์ฒ๋ฆฌํ๋๋ก ์ค๊ณ๋์๋์ง ํ์ธํ์ญ์์ค.
- ์ ๊ทผ์ฑ: ์ธ์ด์ ๊ด๊ณ์์ด ์ ๊ทผ์ฑ์ ๋งค์ฐ ์ค์ํฉ๋๋ค. ์ค์ฝํ๊ฐ ์ ์ฉ๋ ์ปดํฌ๋ํธ๊ฐ ์ฅ์ ๊ฐ ์๋ ์ฌ์ฉ์๋ ์ ๊ทผํ ์ ์๋๋ก ๋ณด์ฅํ์ญ์์ค. ํ์ํ ๊ฒฝ์ฐ ARIA ์์ฑ์ ์ฌ์ฉํ๊ณ ์ ๊ทผ์ฑ ๊ฐ์ด๋๋ผ์ธ์ ๋ฐ๋ฅด์ญ์์ค.
- ๊ธ๋ก๋ฒ ์ฌ์ฉ์๋ฅผ ์ํ ์ฑ๋ฅ: ์ ์ธ๊ณ ์ฌ์ฉ์๊ฐ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ ์ํ ๊ฒ์ ๋๋ค. ์ปดํฌ๋ํธ ์ค์ฝํ๋ ์ฑ๋ฅ์ ํฅ์์ํฌ ์ ์์ต๋๋ค. ๋คํธ์ํฌ ์๋๋ ์ฅ์น์ ๊ด๊ณ์์ด ๋ชจ๋ ์ฌ์ฉ์๋ฅผ ์ํด ์ฝ๋๊ฐ ์ต์ ํ๋์๋์ง ํ์ธํ์ญ์์ค. ์ฝ๋ ๋ถํ ๋ฐ ์ง์ฐ ๋ก๋ฉ๊ณผ ๊ฐ์ ๊ธฐ์ ์ ๊ณ ๋ คํ์ญ์์ค.
- ๋ฌธํ์ ๊ณ ๋ ค ์ฌํญ: ์ฝ๋ ์์ฒด๋ ์ธ์ด์ ๊ตฌ์ ๋ฐ์ง ์์ง๋ง, ์ ํ๋ฆฌ์ผ์ด์ ๋ด์ ์ฝํ ์ธ ๋ ๋ค๋ฅธ ๋ฌธํ์ ๋ง๊ฒ ์กฐ์ ๋์ด์ผ ํ ์ ์์ต๋๋ค. ๋ค์ํ ์ฌ์ฉ์๋ฅผ ์ํด ์ฝํ ์ธ ์กฐ์ ์ ์ฝ๊ฒ ์์ฉํ ์ ์๋ ์ปดํฌ๋ํธ๋ฅผ ๊ฐ๋ฐํ์ญ์์ค.
- ํ ํ์ : ์ปดํฌ๋ํธ ์ค์ฝํ๋ ์ฝ๋ ๊ตฌ์ฑ์ ์ด์งํ๋ฉฐ, ์ด๋ ๊ธ๋ก๋ฒ ๊ฐ๋ฐํ์ ๋งค์ฐ ์ค์ํฉ๋๋ค. ๊ฐ๋ ์ฑ์ ํฅ์์ํค๊ณ ๋ค๋ฅธ ์๊ฐ๋์ ์์น์์์ ํ์ ์ ์ฉ์ดํ๊ฒ ํฉ๋๋ค.
๊ฒฐ๋ก : React ๊ฐ๋ฐ์ ๋ฏธ๋๋ฅผ ์์ฉํ๊ธฐ
React์ ์คํ์ 'scope' ๊ตฌํ์ ์ปดํฌ๋ํธ ์ค์ฝํ ๊ด๋ฆฌ์์ ์ค์ํ ์ง์ ์ ๋ํ๋ ๋๋ค. ์ด ๊ธฐ๋ฅ์ ์์ฉํจ์ผ๋ก์จ ๊ฐ๋ฐ์๋ ๋ ์ฒด๊ณ์ ์ด๊ณ , ์ ์ง๋ณด์ํ๊ธฐ ์ฌ์ฐ๋ฉฐ, ์ฑ๋ฅ์ด ๋ฐ์ด๋ React ์ ํ๋ฆฌ์ผ์ด์ ์ ์์ฑํ ์ ์์ต๋๋ค. ์๊ฒ ์์ํ๊ณ , ๋ชจ๋ฒ ์ฌ๋ก๋ฅผ ๋ฐ๋ฅด๋ฉฐ, ์ด ํฅ๋ฏธ๋ก์ด ์ ๊ธฐ๋ฅ์ ๋ฐ์ ์ ๋ํ ์ ๋ณด๋ฅผ ๊ณ์ ์ฃผ์ํ๋ ๊ฒ์ ์์ง ๋ง์ญ์์ค. React๊ฐ ๊ณ์ ๋ฐ์ ํจ์ ๋ฐ๋ผ, ์ปดํฌ๋ํธ ์ค์ฝํ ๊ด๋ฆฌ๋ ์์ฌํ ์ฌ์ง ์์ด ๊ธ๋ก๋ฒ ์ฌ์ฉ์๋ฅผ ์ํ ๊ฒฌ๊ณ ํ๊ณ ํ์ฅ ๊ฐ๋ฅํ ํ๋ก ํธ์๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ตฌ์ถํ๋ ๋ฐ ์ ์ ๋ ์ค์ํ ์ญํ ์ ํ๊ฒ ๋ ๊ฒ์ ๋๋ค. ์์ ์ ๊ณต๋ ๊ฐ๋ ์ ์ธ ์์ ๋ ๊ณต์ React ๋ฌธ์๊ฐ ๋ฐ์ ํจ์ ๋ฐ๋ผ ๋ณ๊ฒฝ๋ ์ ์์ผ๋ฏ๋ก ํญ์ ์ต์ ๋ฌธ์๋ฅผ ์ฐธ์กฐํ์ญ์์ค.
๋ชจ๋์ฑ๊ณผ ๊ตฌ์ฑ์ ์ค์ ์ ๋ ์ปดํฌ๋ํธ ์ค์ฝํ ๊ด๋ฆฌ๋ ๋ณต์กํ React ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ตฌ์ถํ๋ ๋ฐ ๋งค์ฐ ์ค์ํฉ๋๋ค. ๊ฐ๋ฐ์๋ ์๋ก์ด ๊ธฐ๋ฅ์ ์ฌ์ฉํ์ฌ ์ดํดํ๊ณ , ์ ์ง๋ณด์ํ๊ณ , ํ์ฅํ๊ธฐ ์ฌ์ด ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ง๋ค ์ ์์ต๋๋ค. ๋ง์ง๋ง์ผ๋ก, ํน์ ๋น์ฆ๋์ค ๋ก์ง์ ์ง์คํ๊ณ ์ด ์ค์ฝํ ๊ด๋ฆฌ ๊ตฌํ์ด ์ฝ๋ ํจ์จ์ฑ์ ์ด๋ค ์ํฅ์ ๋ฏธ์น๋์ง ์ ์คํ๊ฒ ๊ณ ๋ คํด์ผ ํฉ๋๋ค. ๋ฐ์ํ ์ ์๋ ๋ค์ํ ์๋๋ฆฌ์ค๋ฅผ ์ฒ ์ ํ ํ ์คํธํ์ญ์์ค. ์คํ์ ์ธ ๊ธฐ๋ฅ์ ํ์ํ๊ณ ํฅํ ์ฌ์ฉ์ ์ํด ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ฐ์ ํ์ญ์์ค.